LinuC-1 - 101試験 - 1.02:ファイル・ディレクトリの操作と管理 - 1.02.4 ファイルの配置と検索

Last Update : August 21 2022 17:47:20

     

a. FHS

1.FHSの概要

FHS(Filesystem Hierarchy Standard)とは、Daniel Quinlan氏らによってまとめられ提唱されているディレクトリ構成を示したファイルの標準化仕様書です。

FHSは、ディレクトリ構造を示すだけでなく、ディレクトリの用途やどのようなファイルをどのディレクトリに配置すべきかなどまで示されています。そのため、OSの各種設定をするときに役立つばかりか、RPMパッケージではなくソースファイル(.tar.gz形式のファイル)をダウンロードしてアプリケーションをインストールしなければならない場合でも、どのディレクトリに保存するのが適切かを理解する上でも参考になります。


2.FHSにおけるディレクトリ構成

(1)システムに必須のファイル

ディレクトリには、システムが起動するために必須なものがまとめられているものがあります。例えば、カーネルイメージは必須なものの1つであり、/etcディレクトリに保存されるファイルは、このシステム自身の設定ファイル群であって起動するために不可欠です。
また/binディレクトリや/sbinディレクトリには、システムの構築時やシステムのリカバリ時に必要なファイルが含まれています。このため、システムが起動する時点で利用できるよう用意されていることが必要です。
そこでFHSでは、次のディレクトリをシステムに必須のファイルを格納する場所として定義しています。
/bin、/boot、/dev、/etc、/lib、/medis、/mnt、
/opt、/sbin、/srv、/tmp、/usr、/var

●Linux のパーティション構成    
 名前   説明
 /bin  必須 一般ユーザー権限で実行できる必須コマンドを格納するディレクトリです。いかなるサブディレクトリも作成しません。
他のファイルシステムがマウントされていないシングルユーザモードであってもこれらのコマンドは使える状態でなければなりません。
 /boot  必須 ブートに必要なファイルが含まれます。
カーネルがユーザモードでのプログラムを実行し始める前にデータを保管するディレクトリでもあります。カーネルは/(ルート)か/boot のどちらかに置くこととされています。
 /dev  必須 デバイスファイル、その他スペシャルファイルが置かれます。
 /etc  必須 システムの設定ファイルが置かれます(xxx.conf など)
プログラムの操作や制御を行う際に必要となる設定ファイルが /etc 階層に配置されます。関連する設定ファイルが多い場合は、/etc 配下にサブディレクトリを作成し、その中に配置する場合もあります。ファイルは必ず静的なものであり、実行可能なバイナリファイルを置いてはいけません。
 /lib  必須 /bin/ や /sbin/ にある実行ファイルの基本となる共有ライブラリ (library) 群の置き場。
 /media  必須 リムーバブルメディアのためのマウントポイント
フロッピーディスクやCD-ROM、ZIPディスクなどのリムーバブルメディアをマウントするためのサブディレクトリを含みます
 /mnt  必須 一時的にファイルシステムをマウントするためのディレクトリです。
 /opt  必須 オプション (option) のアプリケーションソフトウェアパッケージのインストール用
 /sbin  必須 システム管理用のコマンドが置かれます。ブートやシステムのリカバリに必要となる実行ファイルが収められているディレクトリです。
通常、一般ユーザが使う必要のない実行ファイルがここには置かれ、それ以外は /bin に設置されます。shutdown、ifconfig reboot、route、fdisk、fsckなど。
 /srv  必須 システムによって提供されるサービスデータの保存場所
 /tmp  必須 一時的な作業用ディレクトリ(temporary files)で、リブート時にクリアされます。ユーザに関らず使えるディレクトリですが、ディレクトリやファイルが存在し続けることを想定してはいけません。
 /usr  必須 ユーザーが共有する読み出し専用の領域です。
 /var  必須 ログファイルや作業用ファイルを格納する領域です。
スプールディレクトリやファイル、管理用のログデータ、一時利用などが含まれます。/tmp と違い、リブート時に削除されることはありません。
 /home   ユーザーのホームディレクトリです。/home下にユーザーごとのディレクトリが作成されます。
可能であれば当ディレクトリは独立したパーティションにしておく方が良い
 /root   rootのホームディレクトリです。ここには、通常サブディレクトリは作成しないようにします。
 /proc   カーネル内の情報へアクセスするためのインターフェースとして使用されます。カーネルから情報を取り込むか、あるいは、カーネルに情報を送る特別なファイルを収納しています。その情報の例としては、システムメモリー、cpu 情報、及びハードウェア設定などがあります。ファイルシステムは擬似的なファイルシステムです。


b. ファイルの検索

1.指定ファイルを調べる [ find ]

find コマンドは、ファイル名やファイルの種類、最終更新日のようなファイルの属性をもとにファイルの検索をおこないます。また、検索したファイルに対してコマンドを実行することができます。

● find コマンド構文
  find [検索開始ディレクトリ] [検索条件] [コマンド]

※検索開始ディレクトリの省略も可能。この場合カレントディレクトリが検索開始ディレクトリとみなされる。

● find 検索条件
 -name ファイル名 指定されたファイル名を検索する
 -perm num パーミッションがnum(8進数)で指定されたものと一致するものを検索する
 -type タイプ ファイルのタイプが指定されたものと一致するファイルを検索する
b:ブロックデバイス c:キャラクタデバイス d:ディレクトリ f:ファイル l:シンボリックリンク p:名前付きパイプ
 -user ユーザーID 所有者がユーザーIDで指定されたものと一致するファイルを検索する
 -group グループ ファイルがグループで指定されたグループに属しているファイルを検索する
 -size [+-]num[c] ブロックサイズまたはファイルサイズで検索する。「-size 100」だとブロックサイズとみなし、「-size 100c」などと末尾に c をつけるとファイルサイズとみなす。
 -atime [+-]num num日前に最終アクセスがあったファイルを検索する
-atime 4 4日前にアクセスされたファイル
-atime +4 5日以前にアクセスされたファイル
-atime -4 3日以内にアクセスされたファイル
 -mtime [+-]num num日前に最終更新されたファイルを検索する
-mtime 4 ちょうど4日前に修正されたファイル
-mtime +4 5日以前に修正されたファイル
-mtime -4 3日以内に修正されたファイル
 -empty 空のファイルやディレクトリを検索する

数字を判別式として用いる場合、数字の前に「+」をつけると、num以上の数が検索対象となり、「-」をつけるとnum以下の数が検索対象となる。また、何もつけないと、等しいファイルが検索対象になる。

● find コマンド
 -print検索結果をフルパスで標準出力する
 -ls検索結果をパス名など、ls -gildsに相当する情報を表示する
 -exec command \;検索後、コマンドcommandを実行する。検索結果をcommandに引き渡すには{}を用いる。
例:find ~ -name '*bak" -exec rm {} \;
上記の例で-execにつづくrm {} \;が実行されるコマンド。最後の";"は-execのパラメタの終わりを示しており、その前の"\"は、";"がシェルに解釈されないようにエスケープする為のもの。
 -ok command \;-execと同じ。ただし、コマンドの実行前にユーザに確認する

ホームディレクトリ以下の拡張子shtmlのファイルをファイル詳細付きで検索する

$ find ~/ -name "*.html" -ls
2754565 4 -rwxr-xr-x 1 root root 3135 5月 19 2006 /root/.local/share/Trash/files/LPIC/Zkougi/search/search.html 2755495 4 -rwxr-xr-x 1 root root 3135 5月 19 2006 /root/.local/share/Trash/files/LPIC/kougi/search/search.html


2.指定コマンドのフルパスを調べる [ which ]

コマンド入力する際に、環境変数PATHが設定されていないために、フルパスで入力しなければならない時があります。しかし、そのコマンドのフルパスがわからない場合は、which コマンドでフルパスを確認することができます。
ただし、環境変数PATH に設定されていないディレクトリは検索対象からははずれるため、一般ユーザーが管理用のコマンドを検索することはできないことになります。

# which useradd
/usr/sbin/useradd


3.指定コマンドが格納されているディレクトリ情報を調べる [ whereis ]

whereis コマンドは、指定したコマンドのバイナリファイル、ソースファイル、マニュアルなどが格納されているディレクトリを表示するコマンドです。

# whereis useradd
useradd: /usr/sbin/useradd /usr/share/man/man8/useradd.8.gz

● whereis コマンドオプション
 -b バイナリファイルの場所のみ表示する
 -m マニュアルが格納されている場所のみ表示する
 -s ソースファイルの場所のみ表示する


4.指定コマンドが格納されているディレクトリ情報を調べる [ type ]

type コマンドは、シェルがどのコマンドを起動しているかを確認するコマンドです。

● type コマンド構文
  type [オプション] コマンド名

● type コマンドオプション
 -a 同名で実行可能なコマンドを全て表示する
 -f シェル関数は除外する
 -P PATH内のみを探す(whichコマンドと同じ結果になる)
 -p 実行されるコマンドのディスク上のファイル名を表示する(例えば、ビルトインコマンドの場合は何も表示されない)
 -t 実行されるコマンドに応じて「alias」「keyword」「function」「builtin」「file」を表示する。該当するコマンドが見つからない場合は何も表示しない

コマンドラインで入力したときに何が実行されているのかを調べることができます。

# type ls
ls は `ls --color=auto' のエイリアスです

同じ名前のコマンドが複数の場所にあるときには、「type -a コマンド名」で全てを表示することができます

# type -a ls
ls は `ls --color=auto' のエイリアスです
ls は /usr/bin/ls です


5.データベース内から検索 [ locate ]

locate コマンドは、あらかじめ作成されているデータベースを参照して、ファイル及びディレクトリを検索するコマンドです。既にデータベースが作成されている中から検索をかけるため、find コマンドよりも高速に特定のファイルを見つけ出す事ができます。ただし、欠点もあります。それは、データベースの情報が最新でなければ、検索にひっかからないということです。そのため、新規にファイルやディレクトリを作成したり、ソフトウェアをインストールした際には、その都度 updatedb コマンドを使用して、データベースを最新の状態にしておく必要があります。また、その逆も考えられます。データベースが最新でないと、既に削除したファイルなのに、検索するとマッチしてしまいます。実際に見てみるとそのファイルは存在しなかったということもあります。もし、現在の状態からファイルを検索したいのなら、find コマンドを使用する事になります。


なお、現在では、locate コマンドは、slocate コマンドへシンボリックリンクが貼られているため、実際には、slocate コマンドを実行していることになります。slocate コマンドは、データベース内に所有者情報やパーミッションの情報も含まれるため、読み取り権限のないユーザーなどが locate コマンドを実行しても検索にはひっかからないようになっています。これによって、よりセキュリティが向上してします。因みに、slocate データベースは、/var/lib/slocate/slocate.db に格納されています。

# ls -la /usr/bin/locate
lrwxrwxrwx 1 root slocate 7 2月 3 04:33 /usr/bin/locate -> slocate

それでは、実際に解説に移ります。まず、updatedb コマンドを使用してデータベースを最新状態に更新します。なお、updatedb コマンドを使用できるのはスーパーユーザーのみです。

# updatedb

updatedb をバックグラウンドで実行するには、& を付け加えます。

# updatedb &

なお、updatedb コマンドは、cron によって1日に1回、シェルスクリプトによって定期的に実行されるようになっています。

# cat /etc/cron.daily/slocate.cron

#!/bin/sh
renice +19 -p $$ >/dev/null 2>&1
/usr/bin/updatedb -f "nfs,smbfs,ncpfs,proc,devpts" -e "/tmp,/var/tmp,/usr/tmp,/afs,/net"

updatedb コマンドの処理が終えたら、ようやく、locate コマンドを使って検索できるようになります。なお、2度目にupdatedb コマンドを使用する場合には、一度目より早く終了します。以下例は、httpd.conf にマッチするファイルが検索されます。

# locate httpd.conf
/usr/local/apache2/conf/httpd.conf
/usr/local/apache2/conf/httpd.conf.bak

locate コマンドは、ワイルドカード「*」を使用する事もできます。

# locate *td.conf
/usr/local/apache2/conf/httpd.conf
/usr/local/apache2/conf/httpd.conf.bak
/etc/xinetd.conf

5./etc/updatedb.conf

updatedb の設定ファイルは、/etc/updatedb.conf で設定します。updatedb コマンドは、この設定ファイルがないと、CD-ROM内のファイルや、/tmp フォルダなどの一時的に作成されるファイルまでデータベースに含めてしまいます。しかし、CD-ROMなどのファイルまでデータベースに含めてしまうと、CD-ROMを取り除いたときには、存在しないファイルとして検索される事になってしまいます。この問題をさけるために、このupdatedb.conf ファイルで updatedb の対象から除外するファイルシステム、もしくは、ディレクトリへのパスを記述しておきます。記述の仕方は単純で、変数を定義し、それを適用するために、export コマンドを記述しておくだけです。もし、ここで指定されていないもので、updatadb コマンドの対象からはずしたいものがあれば、追記しておくとよいでしょう。

PRUNEFS="devpts NFS nfs afs sfs proc smbfs autofs auto iso9660"
PRUNEPATHS="/tmp /usr/tmp /var/tmp /afs /net /sfs"
export PRUNEFS
export PRUNEPATHS


z. 出題範囲概要

概要 :
  • 典型的なファイルの位置とディレクトリの分類を含む、FHS(Filesystem Hierarchy Standard:ファイルシステム階層標準)について熟知している。

詳細 :

  [ 例題 ] 


         

    www.it-shikaku.jp